//
//  Observable+Moya.swift
//  SLQuickReader
//
//  Created by ALin on 2017/8/3.
//  Copyright © 2017年 ALin. All rights reserved.
//

import SwiftyJSON
import Moya
import RxSwift
import ObjectMapper

// Swift.Error是protocol
enum ORMError: Swift.Error {
    case norepresenter // response为空
    case httperror // status code没有在200-299范围
    case nodata // 数据为空, 针对某一节点下没有数据, 比如空数组
    case nonode // json节点传入错误
    case bizerror(code: UInt, message: String) // 其他的自定义业务错误
}

// 扩展一个协议直接从json里面进行映射的初始化方法
public protocol Mappable{
    init?(jsonData: JSON)
}

extension Observable{
    /// response 转 模型
    func mapResponse2Obj<T: Mappable>(type: T.Type, iterationargs: [String] = []) -> Observable<T?> {
        return map{ representer in
            // ① 判断Moya.Response是否有值
            guard let response = representer as? Moya.Response else{
                throw ORMError.norepresenter
            }
            
            // ② 判断请求状态
            guard (200...209) ~= response.statusCode else{
                throw ORMError.httperror
            }
            
            // ③ 将内容转换成json
            let jsonData = JSON.init(response.data)
            
            if iterationargs.count > 0{
                var result = Optional(jsonData)
                for arg in iterationargs{
                    result = jsonData[arg]
                }
                
                guard let rs = result else{
                    throw ORMError.nonode
                }
                
                return T(jsonData: rs)
                
            }else{
                return T(jsonData: jsonData)
            }
        }
    }
}
